Material UI is a Material Design library made for React.
It’s a set of React components that have Material Design styles.
In this article, we’ll look at how to add text fields with Material UI.
Text Field
Text fields are form controls to let users enter and edit text.
To add them, we use the TextField
component.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
return (
<div className="App">
<TextField label="Standard" />
</div>
);
}
to add a basic text field.
label
is displayed as the placeholder.
We can also add the variant
prop to change the styling.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
return (
<div className="App">
<TextField label="filled" variant="filled" />
</div>
);
}
to add a text field with a background color.
Form Props
We can add the required
prop to make the field required.
disabled
disables the text field.
type
has the input type.
helperText
lets us show users hints.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
return (
<div className="App">
<TextField label="required" required helperText="required field" />
</div>
);
}
to add helper text to our field, which will be displayed at the bottom.
required
adds an asterisk to the label to indicate that it’s required.
Validation
The error
prop lets us toggle the error state.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
export default function App() {
return (
<div className="App">
<TextField label="error" error />
</div>
);
}
to show a text field with errors in it.
It’ll be all red.
Select
The select
prop makes the text field use the Select
component internally.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
import MenuItem from "@material-ui/core/MenuItem";
const fruits = [
{ value: "apple", label: "Apple" },
{ value: "orange", label: "Orange" },
{ value: "grape", label: "Grape" }
];
export default function App() {
const [fruit, setFruit] = React.useState("apple");
const handleChange = event => {
setFruit(event.target.value);
};
return (
<div className="App">
<TextField
select
label="Select"
value={fruit}
onChange={handleChange}
helperText="Please select your fruit"
>
{fruits.map(option => (
<MenuItem key={option.value} value={option.value}>
{option.label}
</MenuItem>
))}
</TextField>
</div>
);
}
We create a dropdown with the TextField
component.
label
has the label.
value
is the selected value.
onChange
runs when we change the selection, which we can use to set the select value state.
Inside the TextField
, we have the MenuItem
components to display the options.
Icons
We can add icons to our TextFields
.
For example, we can write:
import React from "react";
import TextField from "@material-ui/core/TextField";
import Grid from "@material-ui/core/Grid";
import AccountCircle from "@material-ui/icons/AccountCircle";
export default function App() {
return (
<div className="App">
<Grid container spacing={1} alignItems="flex-end">
<Grid item>
<AccountCircle />
</Grid>
<Grid item>
<TextField id="input-with-icon-grid" label="input" />
</Grid>
</Grid>
</div>
);
}
to add a text field beside an icon.
AccountCircle
is the icon.
The TextField
is to the right of it.
Input Adornments
We can use the InputAdornment
component to add prefix, suffix or an action to an input.
For example, we can write:
import React from "react";
import clsx from "clsx";
import InputAdornment from "@material-ui/core/InputAdornment";
import TextField from "@material-ui/core/TextField";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles(theme => ({
margin: {
margin: theme.spacing(1)
},
textField: {
width: "25ch"
}
}));
export default function App() {
const classes = useStyles();
return (
<div className="App">
<TextField
label="length"
id="filled-start-adornment"
className={clsx(classes.margin, classes.textField)}
InputProps={{
startAdornment: (
<InputAdornment position="start">meters</InputAdornment>
)
}}
/>
</div>
);
}
We add a TextField
with an InputAdornment
.
position
set to start
which means that we add a prefix to the input.
It’ll be displayed on the left.
We have a class to add some margins between the prefix and the input box.
Conclusion
We can add text fields to let users enter text.
There are many options we can change to style it the way we want.
Also, we can icons and text beside the input box.
There are also styles for errors.